package futbol.tacticas.concursantes.HambergueAsesino;


import java.awt.Color;
import java.awt.Point;
import java.math.MathContext;
import java.util.Random;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

public class HambergueAsesino implements Tactica{
	   
    private int nValores[][]={
    		{-150,0,7},//Portero
            {-90,40,6},
            {-90,-40,6},
            {-60,70,6},
            {-60,-70,6},
            {-60,0,7},
            {10,30,7},
            {10,-30,7},
            {70,50,7},
            {70,-50,7},
            {80,0,7}
    };
    
    Random rand=new Random();

    public String getNombre(){
        return "Hambergue";
    }
    
    public Color getColor1(){
        return Color.red;
    }
    
    public Color getColor2(){
        return Color.blue;
    }
    
    public Color getColorNumero(){
        return Color.white;
    }
    
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    
    public int getFuerza(int n) {
        return nValores[n][2];
    }
    
    private Point balonTurnoAnterior = new Point();
    private Point balonTurnoSiguiente = new Point();
    private double n;
    private double m;    
    private double distanciaRecorridaBalonEjeX;
    private double distanciaRecorridaBalonEjeY;
    Vector<Comando> comandos = new Vector();
    public Vector<Comando> getComandos(SituacionJugadores sj){
        comandos.clear();
    	Point contrarios[]=sj.getContrario();
        Point jugadores[]=sj.getMisJugadores();
        Point bola=sj.getBola();
        
      //Rotación de los jugadores en el campo cada vez que cae un gol.
        if (Math.abs(bola.x)>=160 && Math.abs(bola.y)<=30){
            for(int i=0;i<100;i++){
                int i1=rand.nextInt(11);
                int i2=rand.nextInt(11);
                if (i1!=i2 && getFuerza(i1)==getFuerza(i2) && i1!=0 && i2!=0){
                    int x=nValores[i1][0];
                    int y=nValores[i1][1];
                    nValores[i1][0]=nValores[i2][0];
                    nValores[i1][1]=nValores[i2][1];
                    nValores[i2][0]=x;
                    nValores[i2][1]=y;
                }
            }
        }
        
      //Saca a todos los jugadores para sus posiciones.
        for (int n=0;n<11;n++) 
        	comandos.add((new ComandoIrA(n,nValores[n][0], nValores[n][1])));
        
        
        m = (bola.getY() - balonTurnoAnterior.getY())/(bola.getX() - balonTurnoAnterior.getX());
        n = bola.getY() - m * bola.getX();

        distanciaRecorridaBalonEjeX = bola.getX() - balonTurnoAnterior.getX();
        distanciaRecorridaBalonEjeY = bola.getY() - balonTurnoAnterior.getY();
        
        
        balonTurnoSiguiente.setLocation(bola.getX()+distanciaRecorridaBalonEjeX,bola.getY()+distanciaRecorridaBalonEjeY);
        
        
        bola = balonTurnoSiguiente;

        int jugMasCercano = sj.getMiJugadorMasCerca(bola.getX(), bola.getY());
        comandos.add(new ComandoIrA(jugMasCercano, bola.x , bola.y));
        //comandos.add(new ComandoTiroAPuerta(jugMasCercano,0));

        
        if (contrarios[0].x>0 || contrarios[1].x>0 || contrarios[2].x>0 || contrarios[3].x>0){
        for (int i=0;i<10;i++)
        {	Point temp = new Point();
        	for (int k=i+1;k<11;k++)
        	{
        		if (contrarios[i].x<contrarios[k].x)
        		{
        			temp = contrarios[i];
        			contrarios[i] = contrarios[k];
        			contrarios[k] = temp;
        		}
        	}
        }
        }
        //Selecciona el jugador más cercano a la pelota para que vaya a por ella
        int nJug=sj.getMasCercanoDeBola();
        comandos.add(new ComandoIrA(nJug, sj.getBola().x , sj.getBola().y));
        
        double[] marca;
               
        for(int n = 1; n < 11; n++)
         {
                marca = marcaje(contrarios[11-n],sj.getBola());
                if(nJug!=n && contrarios[11-n].x<80)
                comandos.add(new ComandoIrA(n, marca[0], marca[1])); 
         }
        comandos.add(new ComandoIrA(jugMasCercano, bola.x , bola.y));
        int angulo =(int) getAngulo(jugadores[jugMasCercano].x, jugadores[jugMasCercano].y, 190, 0);
        angulo =(int) getAngulo(jugadores[nJug].x, jugadores[nJug].y, 190, 0);
        comandos.add(new ComandoTiroAPuerta(jugMasCercano,angulo));
        comandos.add(new ComandoTiroAPuerta(nJug,angulo));
              
       
        //Movimiento portero
        int y=bola.y;
        if (y<-25) y=-25;
        if (y>25) y=25;
        if (bola.x<=-90 && bola.y<75 && bola.y>-75) comandos.add(new ComandoIrA(0,bola.x, bola.y)); else
        comandos.add(new ComandoIrA(0,nValores[0][0],y));
        comandos.add(new ComandoTiroAPuerta(0,0));
        
//    	Posicion real de la bola
        balonTurnoAnterior.setLocation(sj.getBola());
        return comandos;
    }
    
    
    
    double[] marcaje(Point jug,Point bola){
        double[] vector = new double[2];
        double ang = getAngulo(jug.x,jug.y,bola.x,bola.y);
        vector[0]=jug.x+20*Math.cos(ang);
        vector[1]=jug.y+20*Math.sin(ang);
        return vector;
    }

    double getAngulo(double x0, double y0, double xD, double yD)
     {
        double ang=0;
        double dy=yD-y0;
        double dx=xD-x0;
        if (dx>0) ang=Math.atan(dy/dx);
        else if (dx<0) ang=Math.atan(dy/dx)+Math.PI;
        else if (y0<yD) ang=Math.PI/2;
        else ang=-Math.PI/2;
        ang=corregirAngulo(ang);
        return ang;
    }

    static double corregirAngulo(double ang)
    {
        while (ang<0)
            ang+=Math.PI*2;
        while (ang>=Math.PI*2)
            ang-=Math.PI*2;
        return ang;
    } 
    
}
